package org.bopis.utilidades;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigInteger;

import java.security.MessageDigest;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;

import org.apache.log4j.Logger;

/**
 * Clase de utilidades
 * 
 * @author i.fernandezmolina
 * 
 */
public class Utilidades {

	private static Logger log = Logger.getLogger(Utilidades.class);
	private static final String[] ALPHA_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".split("");

	/**
	 * Metodo que comprueba si una cadena es nula o vacia
	 * 
	 * @param cad
	 *            cadena a validar
	 * @return true si es nula o vacia, false en caso contrario
	 */
	public static boolean isVacia(String cad) {

		if (cad == null || cad.trim().length() <= 0) {
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * Metodo que comprueba si una lista es nula o vacia
	 * 
	 * @param cad
	 *            cadena a validar
	 * @return true si es nula o vacia, false en caso contrario
	 */
	public static boolean isVacia(List<?> lista) {

		if (lista == null || lista.size() <= 0) {
			return true;
		} else {
			return false;
		}
	}
	

	/**
	 * Metodo que genera una constraseña aleatoria de 8 caracteres
	 * @return
	 */
	public static String generatePassword() {

		Random generator = new Random();
		String pass = "";

		for (int i = 0; i < 8; i++) {
			pass += ALPHA_CHARS[generator.nextInt(ALPHA_CHARS.length - 1) + 1];
		}

		return pass;
	}

	public static boolean isTelefono(String telefono) {
		// TODO tienes que hacer el metodo que valida los telefonos
		return true;
	}

	public static boolean isEmail(String email) {
		// TODO tienes que hacer el metodo que valida los emails
		return true;
	}
	
	/**
	 * Metodo que condifica a MD5 una cadena
	 * @param cadena cadena a codificar
	 * @return cadena codificada
	 */
	public static String fromStringToMD5(String cadena) {
		
		MessageDigest m = null;
		
		try{
			m = MessageDigest.getInstance("MD5");
			m.update(cadena.getBytes(), 0, cadena.length());
		}catch(Exception e){
			log.info("Se produjo un error codificando a MD5 la cadena " + cadena);
		}		
		
		return new BigInteger(1, m.digest()).toString(16);
	}
		
	/**
	 * Metodo que dado un array de bytes, guarda la información en un fichero.
	 * @param data array que contiene los bytes
	 * @param folder ruta donde almacenar el fichero
	 * @param fileName nombre con el que se va a guardar el fichero
	 * @throws IOException
	 */
	public static void fromByteArrayToFile(byte[] data, String folder, String fileName) throws IOException{		
		OutputStream out = new FileOutputStream(fileName);
		out.write(data);
		out.close();
	}	
	
	/**
	 * Metodo que dada una cadena con una fecha con formato dd/mm/yyyy devuelve un objeto java.util.Date
	 * @param fecha cadena con la fecha
	 * @return objeto java.util.Date; null en caso de que la cadena sea nula o vacia
	 */
	public static Date toDate(String fecha){
		
		Calendar c = Calendar.getInstance();		
		String[] datosFecha = fecha.split("/");
		
		c.set(Integer.parseInt(datosFecha[2]),
				Integer.parseInt(datosFecha[1])-1,
				Integer.parseInt(datosFecha[0]));
		
		return c.getTime();
	}
	

}
